<?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
    // +----------------------------------------------------------------------
    // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
    // +----------------------------------------------------------------------
    // | Author: liu21st <liu21st@gmail.com>
    // +----------------------------------------------------------------------
    namespace think\db\connector;

    use PDO;
    use think\db\Connection;
    use think\Log;

    /**
     * mysql数据库驱动
     */
    class Mysql extends Connection {
        protected $builder = '\\think\\db\\builder\\Mysql';

        /**
         * 取得数据表的字段信息
         * @access public
         * @param string $tableName
         * @return array
         */
        public function getFields($tableName) {
            $this->initConnect(false);
            list($tableName) = explode(' ', $tableName);
            if (false === strpos($tableName, '`')) {
                if (strpos($tableName, '.')) {
                    $tableName = str_replace('.', '`.`', $tableName);
                }
                $tableName = '`' . $tableName . '`';
            }
            $sql = 'SHOW COLUMNS FROM ' . $tableName;
            // 调试开始
            $this->debug(true);
            $pdo = $this->linkID->query($sql);
            // 调试结束
            $this->debug(false, $sql);
            $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
            $info   = [];
            if ($result) {
                foreach ($result as $key => $val) {
                    $val                 = array_change_key_case($val);
                    $info[$val['field']] = [
                        'name'    => $val['field'],
                        'type'    => $val['type'],
                        'notnull' => (bool)('' === $val['null']),
                        // not null is empty, null is yes
                        'default' => $val['default'],
                        'primary' => (strtolower($val['key']) == 'pri'),
                        'autoinc' => (strtolower($val['extra']) == 'auto_increment'),
                    ];
                }
            }
            return $this->fieldCase($info);
        }

        /**
         * 取得数据库的表信息
         * @access public
         * @param string $dbName
         * @return array
         */
        public function getTables($dbName = '') {
            $this->initConnect(false);
            $sql = !empty($dbName) ? 'SHOW TABLES FROM ' . $dbName : 'SHOW TABLES ';
            // 调试开始
            $this->debug(true);
            $pdo = $this->linkID->query($sql);
            // 调试结束
            $this->debug(false, $sql);
            $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
            $info   = [];
            foreach ($result as $key => $val) {
                $info[$key] = current($val);
            }
            return $info;
        }

        /**
         * 解析pdo连接的dsn信息
         * @access protected
         * @param array $config 连接信息
         * @return string
         */
        protected function parseDsn($config) {
            $dsn = 'mysql:dbname=' . $config['database'] . ';host=' . $config['hostname'];
            if (!empty($config['hostport'])) {
                $dsn .= ';port=' . $config['hostport'];
            } elseif (!empty($config['socket'])) {
                $dsn .= ';unix_socket=' . $config['socket'];
            }
            if (!empty($config['charset'])) {
                $dsn .= ';charset=' . $config['charset'];
            }
            return $dsn;
        }

        /**
         * SQL性能分析
         * @access protected
         * @param string $sql
         * @return array
         */
        protected function getExplain($sql) {
            $pdo    = $this->linkID->query("EXPLAIN " . $sql);
            $result = $pdo->fetch(PDO::FETCH_ASSOC);
            $result = array_change_key_case($result);
            if (isset($result['extra'])) {
                if (strpos($result['extra'], 'filesort') || strpos($result['extra'], 'temporary')) {
                    Log::record('SQL:' . $this->queryStr . '[' . $result['extra'] . ']', 'warn');
                }
            }
            return $result;
        }

        protected function supportSavepoint() {
            return true;
        }
    }
